package config

import (
	"os"
	"path/filepath"
	"strings"
	"sync"

	"gopkg.in/yaml.v3"
)

type Config struct {
	// 代理配置
	Proxy struct {
		Host             string `yaml:"host"`
		Port             string `yaml:"port"`
		AutoStart        bool   `yaml:"auto_start"`          // 是否自动启动
		SetSystemOnStart bool   `yaml:"set_system_on_start"` // 是否在启动时设置系统代理
		Filters          struct {
			Protocols    []string `yaml:"protocols"`     // 协议过滤
			ContentTypes []string `yaml:"content_types"` // 内容类型过滤
			Domains      []string `yaml:"domains"`       // 过滤域名
		} `yaml:"filters"`
	} `yaml:"proxy"`

	// 窗口配置
	Window struct {
		Width  int `yaml:"width"`  // 窗口宽度
		Height int `yaml:"height"` // 窗口高度
		X      int `yaml:"x"`      // 窗口 X 坐标
		Y      int `yaml:"y"`      // 窗口 Y 坐标
	} `yaml:"window"`

	configPath string
}

var (
	instance *Config
	once     sync.Once
)

// GetInstance 获取配置单例
func GetInstance() *Config {
	once.Do(func() {
		instance = &Config{}
		instance.configPath = getConfigPath()
		instance.loadConfig()
	})
	return instance
}

// 获取配置文件路径
func getConfigPath() string {
	homeDir, err := os.UserHomeDir()
	if err != nil {
		homeDir = "."
	}
	return filepath.Join(homeDir, ".gopin", "config.yaml")
}

// LoadConfig 加载配置
func (c *Config) loadConfig() error {
	// 确保配置目录存在
	configDir := filepath.Dir(c.configPath)
	if err := os.MkdirAll(configDir, 0755); err != nil {
		return err
	}

	// 如果配置文件存在，则读取
	if _, err := os.Stat(c.configPath); err == nil {
		data, err := os.ReadFile(c.configPath)
		if err != nil {
			return err
		}
		return yaml.Unmarshal(data, c)
	}

	// 设置默认值
	c.Proxy.Host = "0.0.0.0"
	c.Proxy.Port = "8888"
	c.Proxy.AutoStart = false
	c.Proxy.Filters.Protocols = []string{"HTTP", "HTTPS", "WebSocket"}
	c.Proxy.Filters.ContentTypes = []string{"JSON", "Form", "XML"}
	c.Proxy.Filters.Domains = []string{}

	// 添加窗口默认配置
	c.Window.Width = 1400
	c.Window.Height = 800
	c.Window.X = 0
	c.Window.Y = 0

	// 配置文件不存在，保存默认配置
	return c.Save()
}

// Save 保存配置到文件
func (c *Config) Save() error {
	data, err := yaml.Marshal(c)
	if err != nil {
		return err
	}
	return os.WriteFile(c.configPath, data, 0644)
}

// GetProxyAddr 获取代理地址
func (c *Config) GetProxyAddr() string {
	return c.Proxy.Host + ":" + c.Proxy.Port
}

func (c *Config) GetProxyHostPort() (string, string) {
	return c.Proxy.Host, c.Proxy.Port
}

// SetProxyAddr 设置代理地址
func (c *Config) SetProxyAddr(addr string) error {
	if addr == c.GetProxyAddr() {
		return nil
	}
	ss := strings.Split(addr, ":")
	c.Proxy.Host = ss[0]
	c.Proxy.Port = ss[1]
	return c.Save()
}

// IsAutoStart 获取代理启用状态
func (c *Config) IsAutoStart() bool {
	return c.Proxy.AutoStart
}

// SetProxyEnabled 设置代理启用状态
func (c *Config) SetProxyEnabled(enabled bool) error {
	if c.Proxy.AutoStart == enabled {
		return nil
	}
	c.Proxy.AutoStart = enabled
	return c.Save()
}

// GetFilterDomains 获取过滤域名列表
func (c *Config) GetFilterDomains() []string {
	return c.Proxy.Filters.Domains
}

// AddFilterDomain 添加过滤域名
func (c *Config) AddFilterDomain(domain string) error {
	// 检查域名是否已存在
	for _, d := range c.Proxy.Filters.Domains {
		if d == domain {
			return nil
		}
	}
	c.Proxy.Filters.Domains = append(c.Proxy.Filters.Domains, domain)
	return c.Save()
}

// CleanFilterDomains 清空过滤域名
func (c *Config) CleanFilterDomains() error {
	if len(c.Proxy.Filters.Domains) == 0 {
		return nil
	}
	c.Proxy.Filters.Domains = []string{}
	return c.Save()
}

// GetProtocolFilters 获取协议过滤列表
func (c *Config) GetProtocolFilters() []string {
	return c.Proxy.Filters.Protocols
}

// SetProtocolFilters 设置协议过滤
func (c *Config) SetProtocolFilters(protocols []string) error {
	c.Proxy.Filters.Protocols = protocols
	return c.Save()
}

// GetContentTypeFilters 获取内容类型过滤列表
func (c *Config) GetContentTypeFilters() []string {
	return c.Proxy.Filters.ContentTypes
}

// SetContentTypeFilters 设置内容类型过滤
func (c *Config) SetContentTypeFilters(types []string) error {
	c.Proxy.Filters.ContentTypes = types
	return c.Save()
}

// RemoveFilterDomain 删除指定的过滤域名
func (c *Config) RemoveFilterDomain(domain string) error {
	// 查找并删除域名
	for i, d := range c.Proxy.Filters.Domains {
		if d == domain {
			c.Proxy.Filters.Domains = append(c.Proxy.Filters.Domains[:i], c.Proxy.Filters.Domains[i+1:]...)
			return c.Save()
		}
	}
	return nil
}

// GetWindowSize 获取窗口尺寸
func (c *Config) GetWindowSize() (width, height int) {
	return c.Window.Width, c.Window.Height
}

// GetWindowPosition 获取窗口位置
func (c *Config) GetWindowPosition() (x, y int) {
	return c.Window.X, c.Window.Y
}

// SetWindowSize 设置窗口尺寸
func (c *Config) SetWindowSize(width, height int) error {
	if c.Window.Width == width && c.Window.Height == height {
		return nil
	}
	c.Window.Width = width
	c.Window.Height = height
	return c.Save()
}

// SetWindowPosition 设置窗口位置
func (c *Config) SetWindowPosition(x, y int) error {
	if c.Window.X == x && c.Window.Y == y {
		return nil
	}
	c.Window.X = x
	c.Window.Y = y
	return c.Save()
}
